import api from '../config/api';

/**
 * 支付工具函数
 */

// 获取token
const getToken = () => {
  return uni.getStorageSync('token') || '';
};

/**
 * 创建支付订单
 * @param {Object} orderData 订单数据
 * @param {String} orderData.outTradeNo 商户订单号
 * @param {String} orderData.subject 订单名称
 * @param {Number} orderData.totalAmount 付款金额
 * @param {String} orderData.body 商品描述
 * @returns {Promise} 支付结果Promise
 */
export const createPayment = (orderData) => {
  return new Promise((resolve, reject) => {
    // 添加数据校验
    if (!orderData.outTradeNo || !orderData.subject || !orderData.totalAmount) {
      console.error('支付参数不完整:', orderData);
      return reject(new Error('支付参数不完整'));
    }
    
    // 确保总金额是数字类型
    const totalAmount = parseFloat(orderData.totalAmount);
    if (isNaN(totalAmount) || totalAmount <= 0) {
      console.error('支付金额无效:', orderData.totalAmount);
      return reject(new Error('支付金额必须大于0'));
    }
    
    // 构建请求数据
    const requestData = {
      userId: uni.getStorageSync('userId') || 0,
      outTradeNo: orderData.outTradeNo,
      subject: orderData.subject,
      totalAmount: totalAmount,
      body: orderData.body || orderData.subject
    };
    
    console.log('创建支付订单, 请求URL:', api.payment.create);
    console.log('支付请求参数:', JSON.stringify(requestData));
    
    // 发送请求
    uni.request({
      url: api.payment.create,
      method: 'POST',
      data: requestData,
      header: {
        'Authorization': `Bearer ${getToken()}`,
        'Content-Type': 'application/json'
      },
      // 重要：不要自动解析为JSON，因为返回的是HTML表单
      dataType: 'text',
      success: (res) => {
        console.log('支付创建响应:', res);
        if (res.statusCode === 200) {
          // 检查返回的数据是否是HTML表单
          if (res.data && typeof res.data === 'string' && res.data.includes('<form')) {
            console.log('返回了支付表单HTML');
            // 直接返回HTML表单字符串
            resolve(res.data);
          } else if (res.data) {
            // 如果不是HTML表单，可能是JSON字符串或其他数据
            try {
              const jsonData = typeof res.data === 'string' ? JSON.parse(res.data) : res.data;
              resolve(jsonData);
            } catch (e) {
              console.log('数据不是JSON格式，直接返回原始数据');
              resolve(res.data);
            }
          } else {
            // 没有返回数据
            resolve(null);
          }
        } else {
          console.error('支付创建失败, 状态码:', res.statusCode, '响应数据:', res.data);
          reject(new Error(`创建支付失败: ${res.statusCode}, ${JSON.stringify(res.data || {})}`));
        }
      },
      fail: (err) => {
        console.error('支付请求失败:', err);
        // 尝试使用模拟数据（仅测试用）
        if (process.env.NODE_ENV === 'development') {
          console.log('开发环境：使用模拟支付数据');
          // 模拟支付HTML表单，用于测试
          const mockHtml = `
            <form name="punchout_form" method="post" action="https://openapi.alipay.com/gateway.do?charset=UTF-8">
              <input type="hidden" name="biz_content" value="${JSON.stringify(requestData)}">
              <input type="submit" value="立即支付" style="display:none">
            </form>
            <script>document.forms[0].submit();</script>
          `;
          resolve(mockHtml);
        } else {
          reject(err);
        }
      },
      complete: (res) => {
        console.log('支付请求完成:', res);
      }
    });
  });
};

/**
 * 打开支付页面
 * @param {String} formHtml 支付表单HTML
 */
const openPaymentPage = (formHtml) => {
  console.log('准备打开支付页面');
  // 保存表单到临时文件
  const filePath = `${uni.env.USER_DATA_PATH}/payment.html`;
  uni.getFileSystemManager().writeFile({
    filePath,
    data: formHtml,
    encoding: 'utf8',
    success: () => {
      console.log('支付表单已保存到:', filePath);
      // 打开支付页面
      uni.navigateTo({
        url: `/pages/payment/webview?url=${encodeURIComponent('file://' + filePath)}`,
        success: () => {
          console.log('支付页面打开成功');
        },
        fail: (err) => {
          console.error('打开支付页面失败:', err);
        }
      });
    },
    fail: (err) => {
      console.error('保存支付表单失败:', err);
      uni.showToast({
        title: '打开支付页面失败',
        icon: 'none'
      });
    }
  });
};

/**
 * 查询支付状态
 * @param {String} outTradeNo 商户订单号
 * @returns {Promise} 支付状态查询结果Promise
 */
export const queryPaymentStatus = (outTradeNo) => {
  return new Promise((resolve, reject) => {
    if (!outTradeNo) {
      return reject(new Error('订单号不能为空'));
    }
    
    console.log('查询支付状态, 订单号:', outTradeNo);
    
    uni.request({
      url: api.payment.query,
      method: 'GET',
      data: {
        outTradeNo: outTradeNo
      },
      header: {
        'Authorization': `Bearer ${getToken()}`
      },
      success: (res) => {
        console.log('支付状态查询响应:', res);
        if (res.statusCode === 200) {
          resolve(res.data);
        } else {
          console.error('支付状态查询失败, 状态码:', res.statusCode);
          reject(new Error(`查询支付状态失败: ${res.statusCode}`));
        }
      },
      fail: (err) => {
        console.error('支付状态查询请求失败:', err);
        // 开发环境模拟支付成功
        if (process.env.NODE_ENV === 'development') {
          console.log('开发环境：模拟支付成功状态');
          resolve({
            outTradeNo: outTradeNo,
            tradeStatus: 'TRADE_SUCCESS',
            tradeNo: 'DEV_' + Date.now(),
            gmtPayment: new Date().toISOString()
          });
        } else {
          reject(err);
        }
      }
    });
  });
};

/**
 * 更新订单支付状态
 * @param {Number} orderId 订单ID
 * @param {String} status 订单状态
 * @returns {Promise} 更新结果Promise
 */
export const updateOrderPaymentStatus = (orderId, status) => {
  return new Promise((resolve, reject) => {
    if (!orderId) {
      return reject(new Error('订单ID不能为空'));
    }
    
    console.log('更新订单支付状态, 订单ID:', orderId, '状态:', status);
    
    uni.request({
      url: api.payment.status,
      method: 'PUT',
      data: {
        orderId: orderId,
        status: status || '进行中'
      },
      header: {
        'Authorization': `Bearer ${getToken()}`,
        'Content-Type': 'application/json'
      },
      success: (res) => {
        console.log('更新订单状态响应:', res);
        if (res.statusCode === 200) {
          resolve(res.data);
        } else {
          console.error('更新订单状态失败, 状态码:', res.statusCode);
          reject(new Error(`更新订单状态失败: ${res.statusCode}`));
        }
      },
      fail: (err) => {
        console.error('更新订单状态请求失败:', err);
        // 开发环境模拟成功
        if (process.env.NODE_ENV === 'development') {
          console.log('开发环境：模拟更新订单状态成功');
          resolve({ success: true });
        } else {
          reject(err);
        }
      }
    });
  });
};

/**
 * 生成商户订单号
 * @returns {String} 商户订单号
 */
export const generateOutTradeNo = () => {
  const now = new Date();
  const year = now.getFullYear();
  const month = String(now.getMonth() + 1).padStart(2, '0');
  const day = String(now.getDate()).padStart(2, '0');
  const hour = String(now.getHours()).padStart(2, '0');
  const minute = String(now.getMinutes()).padStart(2, '0');
  const second = String(now.getSeconds()).padStart(2, '0');
  const random = Math.floor(Math.random() * 1000).toString().padStart(3, '0');
  
  return `BSJZ${year}${month}${day}${hour}${minute}${second}${random}`;
};

export default {
  createPayment,
  queryPaymentStatus,
  updateOrderPaymentStatus,
  generateOutTradeNo
}; 